package appmodelo.modulo1.dominio.jpa;

import java.io.Serializable;
import java.util.UUID;

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;

@SuppressWarnings("serial")
@MappedSuperclass
public abstract class EntidadeJPA implements Serializable {
	
	
	/**
	 * Controle de concorrencia otimista
	 */ 
	@Version
	@Column(nullable = false, name = "VERSAO")
	private Long versao;
	
	/** 
	 * Utilizado metodos, sobrescritos, Equals(), HashCode() e compareTo() para identificar a Entidade
	 */
	@Column (nullable=false, name="UUID")
	protected String uuid;
	
	/**
	 * Construtor
	 */
	public EntidadeJPA() {
		this.uuid = UUID.randomUUID().toString();
	}
	
	
	public abstract Long getId();
	
	
	@Override
	public int hashCode() {
		return uuid.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if ((obj == null) || (this.getClass() != obj.getClass()))
			return false;
		EntidadeJPA outraEntidade = (EntidadeJPA) obj; 
		return this.uuid.equals(outraEntidade.uuid);
	}
	
	public int compareTo (EntidadeJPA e) {
		return this.uuid.compareTo(e.uuid);
	}

	public String getUuid() {
		return uuid;
	}

	public void setUuid(String uuid) {
		this.uuid = uuid;
	}

	public Long getVersao() {
		return versao;
	}

	public void setVersao(Long versao) {
		this.versao = versao;
	}
}
